package com.imooc.o2o.util;

import com.imooc.o2o.dto.ImageHolder;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

/**
 * 图片util
 * Created by Knight on 2018/6/28.
 */
public class ImageUtil {
    private static String basePath=Thread.currentThread().getContextClassLoader().getResource("").getPath();
    private static final SimpleDateFormat sDateFormat=new SimpleDateFormat("yyyyMMddHHmmss");
    private static final Random r=new Random();
    private static Logger logger= LoggerFactory.getLogger(ImageUtil.class);

    /**
     * 处理缩略图,并返回新生成图片的相对值路径
     * @param imageHolder
     * @param targetAddr
     * @return
     */
    public static String generateThumbnail(ImageHolder imageHolder, String targetAddr){
        String realFileName=getRandomFileName();
        String extension=getFileExtension(imageHolder.getImageName());
        makeDirPath(targetAddr);
        String relativeAddr=targetAddr+realFileName+extension;
        logger.debug("current relativeAddr is:"+relativeAddr);
        File dest=new File(PathUtil.getImgBasePath()+relativeAddr);
        logger.debug("current complete addr is:"+PathUtil.getImgBasePath()+relativeAddr);
        try {
             Thumbnails.of(imageHolder.getImage()).size(200,200)
                    .watermark(Positions.BOTTOM_RIGHT,ImageIO.read(new File(basePath+"/watermark.jpg")),0.25f)
                    .outputQuality(0.8f).toFile(dest);
        }catch (IOException e){
            e.printStackTrace();
        }
        return relativeAddr;
    }

    /**
     * 创建目标路径所涉及到的目录,
     * 即/home/work/xiangze/xxx.jpg,
     * 那么 home work xiangze 这三个文件夹都得自动创建
     * @param targetAddr
     */
    private static void makeDirPath(String targetAddr) {
        String realFileParentPath=PathUtil.getImgBasePath()+targetAddr;
        File dirPath=new File(realFileParentPath);
        if(!dirPath.exists()){
            dirPath.mkdirs();
        }
    }


    /**
     * 获取输入文件流的扩展名
     * @param fileName
     * @return
     */
    private static String getFileExtension(String fileName){
        return  fileName.substring(fileName.lastIndexOf("."),fileName.length());
    }

    /**
     * 生成随机文件名,当前年月日小时分钟秒+五位随机数
     * @return
     */
    public static String getRandomFileName(){
        //获取随机五位数
        int rannum=r.nextInt(89999)+10000;
        String nowTimeStr=sDateFormat.format(new Date());
        return nowTimeStr+rannum;
    }

    /**
     * storePath是文件的路径还是目录的路径
     * 如果是文件路径则删除该文件
     * 如果是目录路径则删除该目录下的所有文件
     * @param storePath
     */
    public static void deleteFileOrPath(String storePath){
        File fileOrPath=new File(PathUtil.getImgBasePath()+storePath);
        if(fileOrPath.exists()){
            if(fileOrPath.isDirectory()){//是目录
                File file[]=fileOrPath.listFiles();
                for(int i=0;i<file.length;i++){
                    file[i].delete();
                }
            }
            fileOrPath.delete();
        }
    }

    /**
     * 处理详情图,并返回新生成图片的相对值路径
     * @param productImgHolder
     * @param dest
     * @return
     */
    public static String generateNormalImg(ImageHolder productImgHolder, String dest) {
        //获取不重复的随机名
        String realFileName=getRandomFileName();
        //获取文件的扩展名如png,jpg等
        String extension=getFileExtension(productImgHolder.getImageName());
        //如果目标路径不存在,则自动创建
        makeDirPath(dest);
        //获取文件存储的相对路径(带文件名)
        String relativeAddr=dest+realFileName+extension;
        logger.debug("current relativeAddr is:"+relativeAddr);
        //获取文件要保存到的目标快路径
        File d=new File(PathUtil.getImgBasePath()+relativeAddr);
        logger.debug("current complete addr is:"+PathUtil.getImgBasePath()+relativeAddr);
        try {
            Thumbnails.of(productImgHolder.getImage()).size(337,640)
                    .watermark(Positions.BOTTOM_RIGHT,ImageIO.read(new File(basePath+"/watermark.jpg")),0.25f)
                    .outputQuality(0.9f).toFile(dest);
        }catch (IOException e){
            logger.error(e.getMessage());
        }
        return relativeAddr;
    }


    public static void main(String[] args) throws IOException {
        Thumbnails.of(new File("C:/Users/Knight/Pictures/Saved Pictures/a.jpg")).size(500,500).watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("C:/Users/Knight/Pictures/Saved Pictures/b.jpg")),0.25f).outputQuality(0.8f).toFile("C:/Users/Knight/Pictures/Saved Pictures/imgnew.jpg");
    }


}
